const Koa = require('koa')
const app = new Koa()
const koaBody = require('koa-body') // 图片上传
const router = require('koa-router')()
const jwt = require('jsonwebtoken')
const koaStatic = require('koa-static')
const path = require('path')
const User = require('./router/users')
const Blogs = require('./router/blogs')
const Upload = require('./router/upload')

app.use(koaStatic(path.join(__dirname, 'public')))

// 1. 搭建图片上传全局中间件
app.use(
	koaBody({
		multipart: true, // 启用文件格式
		formidable: {
			uploadDir: path.join(__dirname, '/public/uploads'), // 设置上传路径
			keepExtensions: true // 保留扩展名 默认false 1.png
		} // 一个上传文件的包
	})
)

// 4. 全局log中间件
app.use(async (ctx, next) => {
	console.log(`GET: ${JSON.stringify(ctx.query)}`)
	console.log(`POST: ${JSON.stringify(ctx.request.body)}`)
	await next()
})

// 5. 登陆校验中间件
const whiteList = ['/api/login', '/api/register']
app.use(async (ctx, next) => {
	console.log('ctx.path------>', ctx.path)
	if (whiteList.includes(ctx.path)) {
		await next()
	} else {
		try {
			// 拿到token。解析token，如果能解析出来，让他往下走
			const { token } = ctx.request.headers
			const userInfo = jwt.verify(token, '1904')
			console.log('userInfo', userInfo)
			// 将用户信息放置在 ctx,state上，方便其他接口做权限使用
			ctx.state.userInfo = userInfo
			// 让他往下执行
			console.log('测试数据', '登陆娇艳')
			await next()
		} catch (err) {
			console.log(err, 'err')
			// 如果解析不出来，给用户提示错误
			ctx.body = { code: 401, err }
		}
	}
})

// 3. 路由注册
// Blogs Upload
app.use(User.routes(), User.allowedMethods())
app.use(Blogs.routes(), Blogs.allowedMethods())
app.use(Upload.routes(), Upload.allowedMethods())

app.listen(3000, () => {
	console.log(`http://localhost:3000`)
})
